原始问题

我想使用docker-compose启动服务并保持容器运行,以便我可以通过“ docker inspect”获取其IP地址。 但是,容器始终在启动后立即退出。

我试图在docker-compose.yml中添加“ command:[“ sleep”,“ 60”]“和其他内容,但是每当我添加带有” command:...“的行时,我都无法调用” docker-compose up“因为我将收到消息“无法启动容器.....系统错误:无效的字符'k'寻找值的开始”

我还尝试将“ CMD sleep 60”和诸如此类的内容添加到Dockerfile本身,但是这些命令似乎并未执行。

是否有一种简单的方法来保持容器的寿命或解决我的问题之一?

编辑:这是我要运行的撰写文件:

version: '2'
services:
  my-test:
    image: ubuntu
    command: bash -c "while true; do echo hello; sleep 2; done"

1
2
3
4
5
6

如果我在OS X下以docker-compose开头,则工作正常,但如果在Ubuntu 16.04下尝试相同操作,则会出现上述错误消息。

如果我尝试使用Dockerfile的方法,则Dockerfile如下所示:

FROM ubuntu:latest
CMD ["sleep", "60"]

1
2
3

哪个似乎什么都没做

编辑2:我必须纠正自己,原来这是与Dockerfile和docker-compose.yml相同的问题:每次我向Dockerfile添加“ CMD ...”或向其中添加“ command ...”撰写文件时,出现无效字符并出现上述错误。 如果我删除了这两个命令,它会正常工作。

最佳答案

要使容器在启动时保持运行 docker-compose ,请使用以下命令

command: tail -F anything

所以你的docker-compose.yml变成

version: '2'
services:
  my-test:
    image: ubuntu
    command: tail -F anything

1
2
3
4
5
6

您可以使用以下命令运行外壳程序以进入容器

docker exec -i -t composename_my-test_1 bash

容器前面 composename 的名称 在哪里 docker-compose

第二高赞答案

您可以使用 tty 配置选项。

version: '3'

services:
  app:
    image: node:8
    tty: true           # <-- This option

1
2
3
4
5
6
7

注意:如果将Dockerfile用于映像和CMDDockerfile中,则此选项将不起作用;但是,您可以entrypoint在compose文件中使用该选项,以CMD从Dockerfile中清除。

第三赞

根据 @aanand在GitHub的评论2015年8月26日 ,可以 tail -f /dev/null 在docker-compose中使用以保持容器运行。

docker-compose.yml示例

version: '3'
services:
  some-app:
    command: tail -f /dev/null

1
2
3
4
5

为什么使用此命令?

选择此选项的唯一原因是它在GitHub上获得了很多赞扬,但是投票率最高的答案并不意味着它是最佳答案。 第二个原因是务实的原因,由于截止日期必须尽快解决问题。